#include "game.h"

//   |   |
//---|---|---
//   |   |   
//---|---|---
//   |   |   

void initboard(char board[ROW][COL],int row,int col)
{
	for(int i=0;i<row;i++)
	{
		for(int j=0;j<col;j++)
		{
			board[i][j]=' ';
		}	
	}
}


//void displayboard(char board[ROW][COL],int row,int col)
//{
//	for(int i=0;i<row;i++)
//	{
//		printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
//		if(i<col-1)
//		printf("---|---|---\n");
//	}
//}
//可以用但是不灵活的死代码，只针对三子棋

void displayboard(char board[ROW][COL],int row,int col)
{
	for(int i=0;i<row;i++)
	{
		for(int j=0;j<col;j++)
		{
			printf(" %c ",board[i][j]);
			if(j<col-1)
			printf("|");
		}
		printf("\n");
		if(i<row-1)
		{
			for(int z=0;z<col;z++)
			{
				printf("---");
				if(z<col-1)
				printf("|");
			}
		}
		printf("\n");
	}
}

void playermove(char board[ROW][COL],int row,int col)
{
	int x=0;
	int y=0;
	printf("玩家下棋\n");
	while(1)
	{
		printf("请输入坐标->");
 		scanf("%d %d",&x,&y);
		if(x>0&&x<=row&&y>0&&y<=col)
		{
			if(board[x-1][y-1]==' ')
			{
				board[x-1][y-1]='X';		
				break;
			}
			else
			{
				printf("此坐标已有棋子\n");
				continue;
			}
		}
		else
		{		
			printf("坐标异常,请重新输入坐标\n");
			continue;
		}
	}
}

void computermove(char board[ROW][COL],int row,int col)
{
	int x=0;
	int y=0;
	printf("电脑下棋\n");
	while(1)
	{
		x=rand()%row;
		y=rand()%col;
		if(x>=0&&x<row&&y>=0&&y<col)
		{
			if(board[x][y]==' ')
			{
				board[x][y]='O';
				break;
			}
		}
	}
}

int Isfull(char board[ROW][COL],int row,int col)
{
	for(int i=0;i<row;i++)
	{
		for(int j=0;j<col;j++)
		{
			if(board[i][j]==' ')
			return 0;
		}
	}
	return 1;
}

char Iswin(char board[ROW][COL],int row,int col)
{
	//判断行和列以及对角线
	for(int i=0;i<row;i++)
	{
		if(board[i][0]==board[i][1]&&board[i][1]==board[i][2])
		{
			if(board[i][0]!=' '&&board[i][1]!=' '&&board[i][2]!=' ')
			return board[i][0];
		}
	}//行胜利
	for(int j=0;j<col;j++)
	{
		if(board[0][j]==board[1][j]&&board[1][j]==board[2][j])
		{
			if(board[0][j]!=' '&&board[1][j]!=' '&&board[2][j]!=' ')
			return board[0][j];
		}
	}//列胜利
	if(board[0][0]==board[1][1]&&board[1][1]==board[2][2])
	{
		if(board[0][0]!=' '&&board[1][1]!=' '&&board[2][2]!=' ')
		return board[0][0];
	}
	if(board[0][2]==board[1][1]&&board[1][1]==board[2][0])
		if(board[0][2]!=' '&&board[1][1]!=' '&&board[2][0]!=' ')
		return board[0][2];//对角线胜利
	if(Isfull(board,ROW,COL))
	{
		return 'q';
	}
	return 'c';
}

void game()
{
	int ret=0;
	char board[ROW][COL]={0};
	initboard(board,ROW,COL);//初始化棋盘
	displayboard(board,ROW,COL);//打印棋盘
	while(1)
	{
		playermove(board,ROW,COL);
		displayboard(board,ROW,COL);//打印棋盘
		ret=Iswin(board,ROW,COL);//判断是否胜利
		if(ret!='c')//判断条件：玩家胜利X，电脑胜利O，平局q，继续游戏c
		{
			break;
		}
		
		computermove(board,ROW,COL);
		displayboard(board,ROW,COL);//打印棋盘
		Iswin(board,ROW,COL);//判断是否胜利
		ret=Iswin(board,ROW,COL);//判断是否胜利
		if(ret!='c')//判断条件：玩家胜利X，电脑胜利O，平局q，继续游戏c
		{
			break;
		}
	}
	if(ret=='X')
	{
		printf("玩家胜利\n");
	}
	else if(ret=='O')
	{
		printf("电脑胜利\n");
	}
	else if(ret=='q')
		printf("平局\n");
}
